#include <iostream>
#include <memory>
#include "Route.hpp"
#include "UdpServer.hpp"
#include "ThreadPool.hpp"

using namespace ThreadPoolModule;
using task_t = std::function<void()>; // 线程池调用的任务必须是无返回值无参数的

int main(int argc, char *argv[])
{
    // 使用方法：./udpserver 8080
    if (argc != 2)
    {
        std::cerr << "Uage:" << argv[0] << " port" << std::endl;
        return 1;
    }
    uint16_t port = std::stoi(argv[1]);
    Enable_Console_Log_Strategy();

    // 1.路由服务
    Route r;

    // 2.线程池
    // 注意是获取单例
    auto tp = ThreadPool<task_t>::GetInstance();

    // 3.用智能指针实现的网络服务对象
    // 构造该对象需要传入port和func,这里用lambda表达式传的func
    std::unique_ptr<UdpServer> usvr = std::make_unique<UdpServer>(port, [&r, &tp](int sockfd, const std::string &message, InetAddr &peer)
                                                                  {
            task_t t = std::bind(&Route::MessageRoute,&r,sockfd,message,peer);//这里的sockfd等都是值了，上一行才是参数
            //使用lambda表达式同样可以
            //task_t t = [&r,sockfd,message,peer](){r.MessageRoute(sockfd,message,peer);}
            tp->Enqueue(t); });

    usvr->Init();
    usvr->Start();

    return 0;
}
